﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.CapaDominio;

namespace Studio7i.CapaPersistencia.DAO
{
    public class InstrumentoDAO : IInstrumentoDAO
    {
        // Métodos CRUD
        /**********************************************************************************************************/
        public Instrumento Crear(Instrumento InstrumentoACrear)
        {
            string _Sentencia = "INSERT INTO Instrumento VALUES(@codigo,@tipo,@marca,@modelo,@anho,@caracteristicas,@costo)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@tipo", InstrumentoACrear.tipo));
                    _Comando.Parameters.Add(new SqlParameter("@marca", InstrumentoACrear.marca));
                    _Comando.Parameters.Add(new SqlParameter("@modelo", InstrumentoACrear.modelo));
                    _Comando.Parameters.Add(new SqlParameter("@anho", InstrumentoACrear.anhoDeFabricacion));
                    _Comando.Parameters.Add(new SqlParameter("@caracteristicas", InstrumentoACrear.caracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@costo", InstrumentoACrear.costoDeAlquiler));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
            //return InstrumentoACrear;
        }

        /**********************************************************************************************************/
        public Instrumento Obtener(int codigo)
        {
            string _Sentencia = "SELECT * FROM Instrumento WHERE CoInstrumento=@codigo";
            Instrumento instrumentoCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            instrumentoCreado = new Instrumento();
                            instrumentoCreado.codigo = (int)_Resultado["CoInstrumento"];
                            instrumentoCreado.tipo = (String)_Resultado["NoTipo"];
                            instrumentoCreado.marca = (String)_Resultado["NoMarca"];
                            instrumentoCreado.modelo = (String)_Resultado["NoModelo"];
                            instrumentoCreado.anhoDeFabricacion = (int)_Resultado["FeFabricacion"];
                            instrumentoCreado.caracteristicas = (String)_Resultado["TxCaracteristicas"];
                            instrumentoCreado.costoDeAlquiler = (decimal)_Resultado["SsAlquiler"];
                        }
                    }
                }
            }
            return instrumentoCreado;
        }

        /**********************************************************************************************************/
        public Instrumento Modificar(Instrumento instrumentoAModificar)
        {
            string _Sentencia = "UPDATE Instrumento SET NoTipo=@tipo, NoMarca=@marca, NoModelo=@modelo, FeFabricacion=@anho, TxCaracteristicas=@caracteristicas, SsAlquiler=@costo WHERE CoInstrumento=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", instrumentoAModificar.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@tipo", instrumentoAModificar.tipo));
                    _Comando.Parameters.Add(new SqlParameter("@marca", instrumentoAModificar.marca));
                    _Comando.Parameters.Add(new SqlParameter("@modelo", instrumentoAModificar.modelo));
                    _Comando.Parameters.Add(new SqlParameter("@anho", instrumentoAModificar.anhoDeFabricacion));
                    _Comando.Parameters.Add(new SqlParameter("@caracteristicas", instrumentoAModificar.caracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@costo", instrumentoAModificar.costoDeAlquiler));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(instrumentoAModificar.codigo);
        }

        /**********************************************************************************************************/
        public void Eliminar(Instrumento instrumentoAEliminar)
        {
            string _Sentencia = "DELETE FROM Instrumento WHERE CoInstrumento=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", instrumentoAEliminar.codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        /**********************************************************************************************************/
        // Métodos Listar
        public ICollection<Instrumento> ListarTodos()
        {
            string _Sentencia = "SELECT CoInstrumento, NoTipo, NoMarca, NoModelo, FeFabricacion, TxCaracteristicas, SsAlquiler FROM Instrumento";
            ICollection<Instrumento> instrumentosEncontrados = new List<Instrumento>();
            Instrumento instrumentoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            instrumentoEncontrado = new Instrumento();
                            instrumentoEncontrado.codigo = (int)_Resultado["CoInstrumento"];
                            instrumentoEncontrado.tipo = (String)_Resultado["NoTipo"];
                            instrumentoEncontrado.marca = (String)_Resultado["NoMarca"];
                            instrumentoEncontrado.modelo = (String)_Resultado["NoModelo"];
                            instrumentoEncontrado.anhoDeFabricacion = (int)_Resultado["FeFabricacion"];
                            instrumentoEncontrado.caracteristicas = (String)_Resultado["TxCaracteristicas"];
                            instrumentoEncontrado.costoDeAlquiler = (decimal)_Resultado["SsAlquiler"];
                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }

        /**********************************************************************************************************/
        public ICollection<Instrumento> ListarXTipo(string tipo)
        {
            string _Sentencia = "SELECT CoInstrumento, NoTipo, NoMarca, NoModelo, FeFabricacion, TxCaracteristicas, SsAlquiler FROM Instrumento WHERE NoTipo LIKE '%'+@tipo+'%'";
            ICollection<Instrumento> instrumentosEncontrados = new List<Instrumento>();
            Instrumento instrumentoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@tipo", tipo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            instrumentoEncontrado = new Instrumento();
                            instrumentoEncontrado.codigo = (int)_Resultado["CoInstrumento"];
                            instrumentoEncontrado.tipo = (String)_Resultado["NoTipo"];
                            instrumentoEncontrado.marca = (String)_Resultado["NoMarca"];
                            instrumentoEncontrado.modelo = (String)_Resultado["NoModelo"];
                            instrumentoEncontrado.anhoDeFabricacion = (int)_Resultado["FeFabricacion"];
                            instrumentoEncontrado.caracteristicas = (String)_Resultado["TxCaracteristicas"];
                            instrumentoEncontrado.costoDeAlquiler = (decimal)_Resultado["SsAlquiler"];
                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }

        /**********************************************************************************************************/
        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CoInstrumento) FROM INSTRUMENTO";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}